package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import jdbc.JDBCProperties;
import jdbc.SimpleConnectionPool;
import model.LinhaProjeto;
import model.LinhaUsuario;
import model.Projeto;
import model.Requisicao;
import model.UsuarioCT;

public class UsuarioProjetoDAO {
	
	private static UsuarioProjetoDAO instancia = null;
	private Connection connection;

	private UsuarioProjetoDAO() throws SQLException {
		//this.connection = ConnectionFactory.getConnection();
		SimpleConnectionPool pool = SimpleConnectionPool.getInstance(JDBCProperties.url, JDBCProperties.login, JDBCProperties.senha, JDBCProperties.driver, 30);
		this.connection = pool.getConnection();
		
//		PostgreSQLAccess p = new PostgreSQLAccess();
//		this.connection = p.getConnection();
		
	}
	
	public static UsuarioProjetoDAO getInstance() throws SQLException {
		if (instancia == null) {
			return new UsuarioProjetoDAO();
		}
		return instancia;
	}
	
	/**
	 * 
	 * @param usuario
	 * @param nomeProjeto
	 * @param tipo
	 * @param pertence
	 * @throws SQLException
	 */
	public void adicionaProjeto(String usuario, String nomeUnix, String tipo, boolean pertence) throws SQLException {

		PreparedStatement stmt = (PreparedStatement) this.connection
				.prepareStatement("INSERT INTO "
						+ "usuarioProjeto(usuario,nomeUnix,tipo,pertence) VALUES (?,?,?,?)");

		stmt.setString(1,usuario);
		stmt.setString(2,nomeUnix);
		stmt.setString(3,tipo);
		stmt.setBoolean(4,pertence);

		//executa
		stmt.execute();
		stmt.close();
	}
	
	/**
	 * 
	 * @param usuario
	 * @return
	 * @throws SQLException
	 */
	public List<LinhaProjeto> listaLinhasProjetos(String usuario) throws SQLException {
		
		
		PreparedStatement stmt = (PreparedStatement)this.connection
		.prepareStatement("SELECT nomeUnix, tipo FROM usuarioProjeto WHERE usuario = ? AND pertence = ?");

		
		
		
//		PreparedStatement stmt = (PreparedStatement)this.connection
//				.prepareStatement("SELECT nomeUnix, tipo FROM usuarioProjeto WHERE usuario = ? AND pertence = ?");
//		stmt.setString(1,usuario);
		//usuarios que realmente pertencem ao projeto = true
		stmt.setBoolean(2,true);
		ResultSet rs = stmt.executeQuery();
		List<LinhaProjeto> linhasProjetos = new ArrayList<LinhaProjeto>();
		while (rs.next()) {
			LinhaProjeto lp = new LinhaProjeto();

			String nomeUnix = rs.getString("nomeUnix");
			String tipo = rs.getString("tipo");
			boolean pertence = true;
			
//			ProjetoDAO daoP = ProjetoDAO.getInstance();
//			lp.setProjeto(daoP.pesquisa(nomeUnix));
			lp.setProjeto(nomeUnix);
			lp.setTipo(tipo);
			lp.setPertence(pertence);
			
			linhasProjetos.add(lp);;
		}
		rs.close();
		stmt.close();
		return linhasProjetos;
	}
	
	/*
	 * Lista os projetos que nao pertecem ao usuario
	 */
	public List<Projeto> listaProjetosQueNaoPertence(String usuario) throws SQLException {
		
		PreparedStatement stmt = (PreparedStatement)this.connection
		.prepareStatement(
				"SELECT DISTINCT nomeUnix FROM usuarioProjeto " +
				"WHERE nomeUnix NOT IN (SELECT nomeUnix FROM usuarioProjeto " +
				"WHERE usuario = ?)");
		stmt.setString(1,usuario);
		ResultSet rs = stmt.executeQuery();
		List<Projeto> projetos = new ArrayList<Projeto>();
		while (rs.next()) {
			String nome = rs.getString("nomeUnix");
			ProjetoDAO dao = ProjetoDAO.getInstance();
			projetos.add(dao.pesquisa(nome));;
		}
		rs.close();
		stmt.close();
		return projetos;
	}
	
	public List<Projeto> listaProjetos(String usuario, String tipo) throws SQLException {
		PreparedStatement stmt = (PreparedStatement)this.connection
				.prepareStatement("SELECT nomeUnix FROM usuarioProjeto WHERE usuario = ? AND tipo = ? AND pertence = ?");
		stmt.setString(1,usuario);
		stmt.setString(2,tipo);
		//usuarios que realmente pertencem ao projeto - true
		stmt.setBoolean(3,true);
		ResultSet rs = stmt.executeQuery();
		List<Projeto> projetos = new ArrayList<Projeto>();
		while (rs.next()) {
			String nome = rs.getString("nomeUnix");
			ProjetoDAO dao = ProjetoDAO.getInstance();
			projetos.add(dao.pesquisa(nome));;
		}
		rs.close();
		stmt.close();
		return projetos;
	}
	
	public boolean ehAdministrador(String usuario, String nomeUnix) throws SQLException {
		PreparedStatement stmt = (PreparedStatement)this.connection
				.prepareStatement("SELECT tipo FROM usuarioProjeto WHERE usuario = ? AND nomeUnix = ? AND pertence = ?");
		stmt.setString(1,usuario);
		stmt.setString(2,nomeUnix);
		//usuarios que realmente pertencem ao projeto - true
		stmt.setBoolean(3,true);
		ResultSet rs = stmt.executeQuery();
		//List<Projeto> projetos = new ArrayList<Projeto>();
		String tipo = "";
		while (rs.next()) {
			tipo = rs.getString("tipo");
		}
		rs.close();
		stmt.close();
		return tipo.equals(UsuarioCT.ADMINISTRADOR);
	}
	
	public List<Requisicao> listaRequisicoes(String usuario) throws SQLException {
		PreparedStatement stmt = (PreparedStatement)this.connection .prepareStatement(
						"SELECT * FROM usuarioProjeto " +
						"WHERE nomeUnix IN (SELECT nomeUnix FROM usuarioProjeto " +
						"WHERE usuario = ? AND tipo = ? AND pertence = true)" +
						"AND pertence = false");
		stmt.setString(1,usuario);
		stmt.setString(2,UsuarioCT.ADMINISTRADOR);
		ResultSet rs = stmt.executeQuery();
		List<Requisicao> requisicoes = new ArrayList<Requisicao>();
		while (rs.next()) {
			String nome = rs.getString("usuario");
			String nomeUnix = rs.getString("nomeUnix");
			String tipo = rs.getString("tipo");
			boolean pertence = rs.getBoolean("pertence");
			Requisicao up = new Requisicao(nome,nomeUnix,tipo,pertence);
			requisicoes.add(up);
		}
		rs.close();
		stmt.close();
		return requisicoes;
	}
	
	public List<LinhaUsuario> listaLinhasUsuarios(String nomeUnix) throws SQLException {
		PreparedStatement stmt = (PreparedStatement)this.connection
				.prepareStatement("SELECT usuario, tipo FROM usuarioProjeto WHERE nomeUnix = ? AND pertence = true");
		stmt.setString(1,nomeUnix);
		ResultSet rs = stmt.executeQuery();
		List<LinhaUsuario> linhasUsuarios = new ArrayList<LinhaUsuario>();
		while (rs.next()) {
			LinhaUsuario lu = new LinhaUsuario();
			
			String usuario = rs.getString("usuario");
			String tipo = rs.getString("tipo");
			
//			UsuarioCTDAO daoCT = UsuarioCTDAO.getInstance();
//			lu.setUsuario(daoCT.getUsuario(usuario));
			lu.setUsuario(usuario);
			lu.setTipo(tipo);
			lu.setPertence(true);
			
			linhasUsuarios.add(lu);
		}
		rs.close();
		stmt.close();
		return linhasUsuarios;
	}
	
	public List<Projeto> listaUsuarios(String nomeUnix, String tipo) throws SQLException {
		PreparedStatement stmt = (PreparedStatement)this.connection.prepareStatement(
						"SELECT usuario FROM usuarioProjeto WHERE nomeUnix = ? " +
						"AND tipo = ?");
		stmt.setString(1,nomeUnix);
		stmt.setString(2,tipo);
		ResultSet rs = stmt.executeQuery();
		List<Projeto> projetos = new ArrayList<Projeto>();
		while (rs.next()) {
			String usuario = rs.getString("usuario");
			ProjetoDAO dao = ProjetoDAO.getInstance();
			projetos.add(dao.pesquisa(usuario));;
		}
		rs.close();
		stmt.close();
		return projetos;
	}
	
	public void alteraRequisicao(String usuario, String nomeUnix, boolean pertence) throws SQLException {
		PreparedStatement stmt = (PreparedStatement)connection.prepareStatement(
						"UPDATE usuarioProjeto SET pertence = ? " +
						"WHERE usuario = ? AND nomeUnix = ?");
		stmt.setBoolean(1,pertence);
		stmt.setString(2,usuario);
		stmt.setString(3,nomeUnix);
		stmt.execute();
		stmt.close();
	}

	public void remove(String usuario, String nomeUnix) throws SQLException {
		PreparedStatement stmt = (PreparedStatement)connection.prepareStatement(
						"DELETE FROM usuarioProjeto WHERE usuario=? AND " +
						"nomeUnix=?");
		stmt.setString(1,usuario);
		stmt.setString(2,nomeUnix);
		stmt.execute();
		stmt.close();
	}
}